<?php
/**
* Класс для загрузки изображений
*
* открытая переменная $nameArrayFilesUpload  содержит название массива загруженных файлов
* закрытая переменная $sizeImageSmall        содержит размер маленькой картинки
* закрытая переменная $sizeImageMiddlee       содержит размер средней картинки
* закрытая переменная $prefixFull            содержит префикс исходного изображения
* закрытая переменная $prefixMiddle           содержит префикс уменьшенного среднего изображения
* закрытая переменная $prefixSmall           содержит префикс уменьшенного маленького изображения
* закрытая переменная $dirImages         содержит путь к изображениям пользователя
* закрытая переменная $filePathFull         содержит полный путь к файлу исходного изображения
* закрытая переменная $filePathMiddle        содержит полный путь к файла среднего изображения
* закрытая переменная $filePathSmall        содержит полный путь к файла маленького изображения
* закрытая переменная $ID_user                                    содержит ID текущего пользователя
* закрытая переменная $currentExpansion      содержит расширение залитого файла изображения
* закрытая переменная $currentDir                              содержит имя директори для переданной сущьности
* закрытая переменная $currentDir                              содержит имя таблицы для переданной сущьности
*/
/**
 * Image 
 * 
 * Класс для загрузки изображений
 * 
 * Доработал до относительно приличного вида:
 * @author Алексей Семенов <semyonov_leha@mail.ru>
 * @version 1.1
 */
class Image{

       public  $nameArrayFilesUpload = 'arrayfiles';
       private $sizeImageSmall    = 50;
       private $sizeImageMiddle    = 100;
       private $prefixFull        = 'f_';
       private $prefixMiddle       = 'm_';
       private $prefixSmall       = 's_';
       private $dirImages     = '';
       private $filePathFull           = '';
       private $filePathMiddle          = '';
       private $filePathSmall    = '';
       private $ID_user                                          = '';
       private $currentExpansion  = '';
       private $currentDir                              = '';
       private $currentTable                    = '';

       /**
        * Метод  __construct конструктор
        *
        * @param  $currentParam содержит название сущности которое было передано по идентификатору
        */
       public function __construct($currentParam){
       
       $this->currentDir = $currentParam . '/';
       $this->currentTable = $currentParam ;
       error_reporting(E_ALL);
 }
 
  /**
   * Метод получает Id текущего пользователя
   *
   */
 public function createDir($essence, $ID_essence){
       $this->ID_essence = $ID_essence;
       // путь директории картинок для пользователя
       $this->dirImages = IMAGES . $essence . '/' . $this->ID_essence . '/';
       // ссылка на файл оригинального размера
       $this->filePathFull = $this->dirImages . $this->prefixFull . $this->ID_essence;
       // ссылка на файл  размера 100 / 100
       $this->filePathMiddle = $this->dirImages . $this->prefixMiddle . $this->ID_essence;
       // ссылка на файл  размера  50  / 50
       $this->filePathSmall = $this->dirImages . $this->prefixSmall . $this->ID_essence;
 }  

   /**
        * Метод  setExpansion записывает в базу расширения изображения которое залил пользователь  
        */
 public function setExpansion($essence, $ID_essence){
       $objDB = Service_Database::instance();
       $stmt = 'UPDATE `' . $this->currentTable . '`
        SET `pic_path` = "' . $this->currentExpansion . '"
        WHERE `' . $essence . '`.`ID_' . $essence . '` = ' . $ID_essence;
       $objDB->query($stmt);
       //throw new Exception('Файл успешно закачан и добавлен в базу !!!<br />');
 }
 
   /**
  * Метод  removeImage удаляет из базы расширения изображения которое залил пользователь
        * удаляет папку с картинками пользователя с диска
        */
 public function removeImage(){
       $objDB = Service_Database::instance();
       $stmt = 'UPDATE `' . $this->currentTable . '`
        SET `pic_path` = ""
        WHERE `' . $this->currentTable . '`.`ID_' . $this->currentTable . '` = ' . $this->ID_user;
       $objDB->query($stmt);  
       // удаление файлов в директории
       unlink($this->filePathFull);
       unlink($this->filePathMiddle);
       unlink($this->filePathSmall);
       // удаление директории пользователя
       rmdir($this->dirImages);
 }
 
    /**
        * Метод  getImage получает  из базы расширение изображения которое залил пользователь
        * формирует пути к файлам изображения
        *
        * @return array $arrayReturn  массив содержащий пути к файлам пользователя, если нет записей то вернет 0
        */
 public function getImage($essence, $ID_essence){
       $objDB = Service_Database::instance();
       $stmt = 'SELECT `pic_path`
        FROM `' . $essence . '`
        WHERE `ID_' . $essence . '` = ' . $ID_essence;
       if ( $strQuery = ($objDB->select($stmt))){
       // получение расширения файла
       $fileStr = '.' . $strQuery[0]['pic_path'];
       // путь директории картинок для пользователя
       $this->dirImages = IMAGES . $essence . '/' . $ID_essence . '/';
       $arrayReturn[] = $this->dirImages . $this->prefixFull . $ID_essence . $fileStr;
       $arrayReturn[] =  $this->dirImages . $this->prefixMiddle . $ID_essence . $fileStr;
       $arrayReturn[] =  $this->dirImages . $this->prefixSmall . $ID_essence . $fileStr;
       return  $arrayReturn;
       }
       else {
         return 0;
       }
 }
 
   /**
        * Метод  chekUpload проверяет закаченный файл на тип/расширение
        */
 public function checkUpload($essence, $ID_essence){
       $tempfilePath = $_FILES[$this->nameArrayFilesUpload]["tmp_name"];
       $fileType = $_FILES[$this->nameArrayFilesUpload]["type"];
       $this->createDir($essence, $ID_essence);
       // проверка на существование файлов. формирование путей к файлам с выборкой из базы
       $arrayImages = $this->getImage($essence, $ID_essence);
       switch ($fileType){
       case 'image/jpeg':{
             $this->createImageJpg($tempfilePath);
             break;  
       }
       case 'image/gif':{
             $this->createImageGif($tempfilePath);
             break;  
       }
       case 'image/bmp':{
             $this->createImageBmp($tempfilePath);
             break;          
       }
       case 'image/x-png':{
             $this->createImagePng($tempfilePath);
             break;          
       }
       default:{
             echo 'Такой тип файла не поддерживается на закачку !!!<br />'; 
             break;  
       }
    }      
 }


 /**
  * Метод  moveFile создает директорию пользователя для картинок.
  * перемещает закачанный файл в папку пользователя
  *
  * @param string $tempfilePath путь к закаченному файлу temp директория
  * @param string $fileType   расширение файла
  */
 public  function moveFile($tempfilePath, $filePathFull){
       if (!is_dir($this->dirImages)){
        echo $this->dirImages . '<br /><br />';
         if (!mkdir($this->dirImages)){
            throw new Exception('Невозможно создать директорию для закачки <br />');
               exit();
           }
        }
     //  копирование закаченного файла в директорию с картинками
        if (!copy($tempfilePath, $filePathFull)){
           throw new Exception('Невозможно скопировать закаченный файл <br />');
             exit();
         }
       }
 
/**
 * Метод createImageJpg служит для создания изображения из закаченного файла
 *
 * @param string $tempfilePath переменная содержит путь к закаченному файлу
 */
 private function createImageJpg($tempfilePath){
  $fileType = '.jpg';
  $filePathFull = $this->filePathFull . $fileType;
  $filePathMiddle = $this->filePathMiddle . $fileType;
  $filePathSmall = $this->filePathSmall . $fileType;   
  $this->moveFile($tempfilePath, $filePathFull, $filePathMiddle, $filePathSmall);
        // получение размеров изображения      
        list($width, $height) = getimagesize($filePathFull);
  // записть в св-во разрешения загруженного изображения
        $this->currentExpansion = 'jpg';
        if ( !$newImage = imagecreatefromjpeg($filePathFull)){
               throw new Exception('Ошибка при открытии изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageMiddle
        if ($height > $width){
         if ( !$imageMiddle = imagecreatetruecolor($this->sizeImageMiddle / $width * $height, $this->sizeImageMiddle) ){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();
         } 
         imagecopyresampled($imageMiddle, $newImage, 0, 0, 0, 0, $this->sizeImageMiddle / $width * $height, $this->sizeImageMiddle, $width, $height);
        }
     else{
      if ( !$imageMiddle = imagecreatetruecolor($this->sizeImageMiddle, $this->sizeImageMiddle / $width * $height) ){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();
         } 
      imagecopyresampled($imageMiddle, $newImage, 0, 0, 0, 0, $this->sizeImageMiddle, $this->sizeImageMiddle / $width * $height, $width, $height);
     }
     // сохранение изображения на диск
        if ( !imagejpeg($imageMiddle, $filePathMiddle, 100)){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageSmall
        if ( !$imageSmall = imagecreatetruecolor($this->sizeImageSmall, $this->sizeImageSmall)){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();        
        }
        if ($height > $width){
         if ( !$imageSmall = imagecreatetruecolor($this->sizeImageSmall / $width * $height, $this->sizeImageSmall)){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();        
         }
         imagecopyresampled($imageSmall, $newImage, 0, 0, 0, 0, $this->sizeImageSmall / $width * $height, $this->sizeImageSmall, $width, $height);
        }
        else{ 
         if ( !$imageSmall = imagecreatetruecolor($this->sizeImageSmall, $this->sizeImageSmall / $width * $height)){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();        
         }
         imagecopyresampled($imageSmall, $newImage, 0, 0, 0, 0, $this->sizeImageSmall, $this->sizeImageSmall / $width * $height, $width, $height);
        }
        if ( !imagejpeg($imageSmall, $filePathSmall, 100) ){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
 }
 
 private function createImageGif($tempfilePath){
  $fileType = '.gif';
  $filePathFull = $this->filePathFull . $fileType;
  $filePathMiddle = $this->filePathMiddle . $fileType;
  $filePathSmall = $this->filePathSmall . $fileType;   
  $this->moveFile($tempfilePath, $filePathFull);
        // получение размеров изображения      
        list($width, $height) = getimagesize($filePathFull);
  // записть в св-во разрешения загруженного изображения
        $this->currentExpansion = 'gif';
        if ( !$newImage = imagecreatefromgif($filePathFull)){
               throw new Exception('Ошибка при открытии изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageMiddle
        if ( !$imageMiddle = imagecreatetruecolor($this->sizeImageMiddle, $this->sizeImageMiddle) ){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();
        }
        imagecopyresampled($imageMiddle, $newImage, 0, 0, 0, 0, $this->sizeImageMiddle, $this->sizeImageMiddle, $width, $height);
        // сохранение изображения на диск
        if ( !imagegif($imageMiddle, $filePathMiddle, 100)){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageSmall
        if ( !$imageSmall = imagecreatetruecolor($this->sizeImageSmall, $this->sizeImageSmall)){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();        
        }
        imagecopyresampled($imageSmall, $newImage, 0, 0, 0, 0, $this->sizeImageSmall, $this->sizeImageSmall, $width, $height);
        if ( !imagegif($imageSmall, $filePathSmall, 100) ){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
 }
 
 
 private function createImageBmp($tempfilePath){
  $fileType = '.bmp';
  $filePathFull = $this->filePathFull . $fileType;
  $filePathMiddle = $this->filePathMiddle . $fileType;
  $filePathSmall = $this->filePathSmall . $fileType;   
  $this->moveFile($tempfilePath, $filePathFull);
        // получение размеров изображения      
        list($width, $height) = getimagesize($filePathFull);
  // записть в св-во разрешения загруженного изображения
        $this->currentExpansion = 'bmp';
        if ( !$newImage = imagecreatefrombmp($filePathFull)){
               throw new Exception('Ошибка при открытии изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageMiddle
        if ( !$imageMiddle = imagecreatetruecolor($this->sizeImageMiddle, $this->sizeImageMiddle) ){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();
        }
        imagecopyresampled($imageMiddle, $newImage, 0, 0, 0, 0, $this->sizeImageMiddle, $this->sizeImageMiddle, $width, $height);
        // сохранение изображения на диск
        if ( !imagebmp($imageMiddle, $filePathMiddle, 100)){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageSmall
        if ( !$imageSmall = imagecreatetruecolor($this->sizeImageSmall, $this->sizeImageSmall)){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();        
        }
        imagecopyresampled($imageSmall, $newImage, 0, 0, 0, 0, $this->sizeImageSmall, $this->sizeImageSmall, $width, $height);
        if ( !imagebmp($imageSmall, $filePathSmall, 100) ){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
 }
 
 public function deleteImage($dirPath, $ID_essence){
     // удаление файлов в директории
       unlink ($dirPath . '/m_' . $ID_essence . '.jpg');
       unlink ($dirPath . '/s_' . $ID_essence . '.jpg');
       unlink ($dirPath . '/f_' . $ID_essence . '.jpg');
       // удаление директории пользователя
       rmdir($dirPath);
 }
 
 private function createImagePng($tempfilePath){
  $fileType = '.png';
  $filePathFull = $this->filePathFull . $fileType;
  $filePathMiddle = $this->filePathMiddle . $fileType;
  $filePathSmall = $this->filePathSmall . $fileType;   
  $this->moveFile($tempfilePath, $filePathFull);
        // получение размеров изображения      
        list($width, $height) = getimagesize($filePathFull);
  // записть в св-во разрешения загруженного изображения
        $this->currentExpansion = 'png';
        if ( !$newImage = imagecreatefrompng($filePathFull)){
               throw new Exception('Ошибка при открытии изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageMiddle
        if ( !$imageMiddle = imagecreatetruecolor($this->sizeImageMiddle, $this->sizeImageMiddle) ){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();
        }
        imagecopyresampled($imageMiddle, $newImage, 0, 0, 0, 0, $this->sizeImageMiddle, $this->sizeImageMiddle, $width, $height);
        // сохранение изображения на диск
        if ( !imagepng($imageMiddle, $filePathMiddle, 100)){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
        // создание нового изображения по размерам $this->sizeImageSmall
        if ( !$imageSmall = imagecreatetruecolor($this->sizeImageSmall, $this->sizeImageSmall)){
               throw new Exception('Ошибка при создании изображения <br />');
                       exit();        
        }
        imagecopyresampled($imageSmall, $newImage, 0, 0, 0, 0, $this->sizeImageSmall, $this->sizeImageSmall, $width, $height);
        if ( !imagepng($imageSmall, $filePathSmall, 100) ){
               throw new Exception('Ошибка при cохранении изображения <br />');
                       exit();
        }
 }
 
 
 public function __destruct() {}
}      
?>